package com.zyg.proxy.base;

import com.zyg.proxy.service.UserService;
import com.zyg.proxy.service.impl.UserServiceImpl;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * Cglib动态代理
 */
public class CglibProxyDemo {
    public static void main(String[] args) {
        UserService userService = createUserServiceCglibProxy(UserServiceImpl.class);
        userService.save();
    }

   public static UserService createUserServiceCglibProxy(Class clazz){
       //创建Enhancer对象（可以理解为内存中动态创建了一个类的字节码）
       Enhancer enhancer = new Enhancer();
       //设置Enhancer对象的父类是指定类型UserServerImpl
       enhancer.setSuperclass(clazz);
       //设置回调方法
       enhancer.setCallback(new MethodInterceptor() {
           public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
               //通过调用父类的方法实现对原始方法的调用
               Object ret = methodProxy.invokeSuper(o, args);
               //后置增强内容，与JDKProxy区别：JDKProxy仅对接口方法做增强，cglib对所有方法做增强，包括Object类中的方法
               if(method.getName().equals("save")) {
                   System.out.println("刮大白3");
                   System.out.println("贴墙纸3");
               }
               return ret;
           }
       });
       //使用Enhancer对象创建对应的对象
       return (UserService) enhancer.create();
   }
}
